/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.manager.criar;

import br.com.foxinline.enums.TipoBanco;
import br.com.foxinline.enums.TipoDocumento;
import br.com.foxinline.modelo.Banco;
import br.com.foxinline.modelo.Pessoa;
import br.com.foxinline.servico.BancoServico;
import br.com.foxinline.servico.PessoaServico;
import br.com.foxinline.util.Msg;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import org.primefaces.context.RequestContext;

/**
 *
 * @author ely
 */
@ViewScoped
@ManagedBean
public class ManagerCriarCliente implements Serializable {

    @EJB
    PessoaServico pessoaServico;
    @EJB
    BancoServico bancoServico;
    private Pessoa cliente;
    private Banco banco;
    private List<Banco> bancos;
    private List<Pessoa> clientes;
    private static final String msgFailure = ":: Erro de validação: o valor é necessário.";

    @PostConstruct
    public void init() {
        cliente = new Pessoa();
        cliente.setTipoDocumento(TipoDocumento.CPF);
        banco = new Banco();
        bancos = new ArrayList<Banco>();
        clientes = pessoaServico.findLimit(null);
    }

    public void salvar() {
        try {
            cliente.setBancos(bancos);
            pessoaServico.salvar(cliente);
            Msg.messagemInfoRedirect(Msg.SuccessFull, "indexcliente.xhtml");
            init();
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public List<SelectItem> getTipoDocumento() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        for (TipoDocumento tipo : TipoDocumento.values()) {
            items.add(new SelectItem(tipo, tipo.getNome()));
        }
        return items;
    }

    public List<SelectItem> getTipoBanco() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        for (TipoBanco tipo : TipoBanco.values()) {
            items.add(new SelectItem(tipo, tipo.getNome()));
        }
        return items;
    }

    public void existeCliente() {
        Pessoa p = pessoaServico.existProprietario(cliente);

        if (p != null) {
            cliente = p;
        } else {
            cliente.setId(null);
        }
    }

    public boolean isPessoaFisica() {
        return cliente.getTipoDocumento().equals(TipoDocumento.CPF);
    }

    public void adicionarBanco() {
        if (bancoValido()) {
            if (!bancos.contains(banco)) {
                bancos.add(banco);
            }
            banco = new Banco();
        } else {
            RequestContext.getCurrentInstance().execute("required(true)");
        }
    }

    private boolean bancoValido() {

        if (banco.getTipoBanco() == null && banco.getTipoBanco() == null) {
            Msg.messagemError("Tipo Banco".concat(msgFailure));
        }
        if (banco.getTipoBanco() == null && banco.getTipoBanco() == null) {
            Msg.messagemError("Agência".concat(msgFailure));
        }
        if (banco.getTipoBanco() == null && banco.getTipoBanco() == null) {
            Msg.messagemError("Conta".concat(msgFailure));
        }

        if ((banco.getTipoBanco() == null && banco.getTipoBanco() == null)
                || (banco.getTipoBanco() == null && banco.getTipoBanco() == null)
                || (banco.getTipoBanco() == null && banco.getTipoBanco() == null)) {
            return false;
        }

        return true;
    }

    public void editarBanco(Banco b) {
        banco = b;
        bancos.remove(b);
    }

    public void removerBanco(Banco b) {
        bancos.remove(b);
    }

    public Pessoa getCliente() {
        return cliente;
    }

    public void setCliente(Pessoa cliente) {
        this.cliente = cliente;
    }

    public Banco getBanco() {
        return banco;
    }

    public void setBanco(Banco banco) {
        this.banco = banco;
    }

    public List<Banco> getBancos() {
        return bancos;
    }

    public void setBancos(List<Banco> bancos) {
        this.bancos = bancos;
    }

    public List<Pessoa> getClientes() {
        return clientes;
    }

    public void setClientes(List<Pessoa> clientes) {
        this.clientes = clientes;
    }
}
